// MIR for `main` 0 nll

| Free Region Mapping
| '?0 | Global | ['?0, '?1]
| '?1 | Local | ['?1]
|
| Inferred Region Values
| '?0 | U0 | {bb0[0..=8], bb1[0..=7], bb2[0..=3], bb3[0..=3], bb4[0..=1], bb5[0..=2], bb6[0..=5], bb7[0], '?0, '?1}
| '?1 | U0 | {bb0[0..=8], bb1[0..=7], bb2[0..=3], bb3[0..=3], bb4[0..=1], bb5[0..=2], bb6[0..=5], bb7[0], '?1}
| '?2 | U0 | {bb1[0..=7], bb2[0..=2]}
| '?3 | U0 | {bb1[1..=7], bb2[0..=2]}
| '?4 | U0 | {bb1[4..=7], bb2[0..=2]}
|
| Inference Constraints
| '?0 live at {bb0[0..=8], bb1[0..=7], bb2[0..=3], bb3[0..=3], bb4[0..=1], bb5[0..=2], bb6[0..=5], bb7[0]}
| '?1 live at {bb0[0..=8], bb1[0..=7], bb2[0..=3], bb3[0..=3], bb4[0..=1], bb5[0..=2], bb6[0..=5], bb7[0]}
| '?2 live at {bb1[0]}
| '?3 live at {bb1[1..=3]}
| '?4 live at {bb1[4..=7], bb2[0..=2]}
| '?2: '?3 due to Assignment at Single(bb1[0]) ($DIR/region_subtyping_basic.rs:19:13: 19:18 (#0)
| '?3: '?4 due to Assignment at Single(bb1[3]) ($DIR/region_subtyping_basic.rs:20:13: 20:14 (#0)
|
fn main() -> () {
    let mut _0: ();
    let mut _1: [usize; ValTree(Leaf(0x00000003): usize)];
    let _3: usize;
    let mut _4: usize;
    let mut _5: bool;
    let mut _7: bool;
    let _8: bool;
    let mut _9: usize;
    let _10: bool;
    scope 1 {
        debug v => _1;
        let _2: &'?3 usize;
        scope 2 {
            debug p => _2;
            let _6: &'?4 usize;
            scope 3 {
                debug q => _6;
            }
        }
    }

    bb0: {
        StorageLive(_1);
        _1 = [const ConstValue(Scalar(0x00000001): usize), const ConstValue(Scalar(0x00000002): usize), const ConstValue(Scalar(0x00000003): usize)];
        FakeRead(ForLet(None), _1);
        StorageLive(_2);
        StorageLive(_3);
        _3 = const ConstValue(Scalar(0x00000000): usize);
        _4 = Len(_1);
        _5 = Lt(_3, _4);
        assert(move _5, "index out of bounds: the length is {} but the index is {}", move _4, _3) -> [success: bb1, unwind: bb7];
    }

    bb1: {
        _2 = &'?2 _1[_3];
        FakeRead(ForLet(None), _2);
        StorageLive(_6);
        _6 = _2;
        FakeRead(ForLet(None), _6);
        StorageLive(_7);
        _7 = const ConstValue(Scalar(0x01): bool);
        switchInt(move _7) -> [0: bb4, otherwise: bb2];
    }

    bb2: {
        StorageLive(_8);
        StorageLive(_9);
        _9 = (*_6);
        _8 = ConstValue(ZeroSized: fn(usize) -> bool {use_x})(move _9) -> [return: bb3, unwind: bb7];
    }

    bb3: {
        StorageDead(_9);
        StorageDead(_8);
        _0 = const ConstValue(ZeroSized: ());
        goto -> bb6;
    }

    bb4: {
        StorageLive(_10);
        _10 = ConstValue(ZeroSized: fn(usize) -> bool {use_x})(const ConstValue(Scalar(0x00000016): usize)) -> [return: bb5, unwind: bb7];
    }

    bb5: {
        StorageDead(_10);
        _0 = const ConstValue(ZeroSized: ());
        goto -> bb6;
    }

    bb6: {
        StorageDead(_7);
        StorageDead(_6);
        StorageDead(_3);
        StorageDead(_2);
        StorageDead(_1);
        return;
    }

    bb7 (cleanup): {
        resume;
    }
}
